package string;

public class D230814 {
    // 验证IP地址
    public String solve (String IP) {
        if (isIPv4(IP)) {
            return "IPv4";
        } else if (isIPv6(IP)) {
            return "IPv6";
        }
        return "Neither";
    }
    private boolean isIPv4(String IP) {
        if (!IP.contains(".")) {
            return false;
        }
        // 分割字符串
        String[] str = IP.split("\\.");
        if (str.length != 4) {
            return false;
        }

        for (String s : str) {
            // 长度不符合，或者长度大于 1，但是 0 开头，
            if (s.length() <= 0 || s.length() > 3
                    || (s.length() > 1 && s.charAt(0) == '0')) {
                return false;
            }
            try {
                // 转为整数，检查大小
                int num = Integer.valueOf(s);
                if (num < 0 || num > 255) {
                    return false;
                }
            } catch(Exception e) {
                return false;
            }
        }
        return true;
    }
    private boolean isIPv6(String IP) {
        if (!IP.contains(":")) {
            return false;
        }
        // 分割字符串
        String[] str = IP.split(":", -1);
        if (str.length != 8) {
            return false;
        }
        for (String s : str) {
            // 长度不符合
            if (s.length() <= 0 || s.length() > 4) {
                return false;
            }

            for (char ch : s.toCharArray()) {
                if (Character.isDigit(ch)) {
                    continue;
                } else if (ch >= 65 && ch <= 70) {
                    continue;
                } else if (ch >= 97 && ch <= 102) {
                    continue;
                }
                return false;
            }
        }
        return true;
    }


    // 大数加法
    public String solve (String s, String t) {
        StringBuilder res = new StringBuilder();
        // 从后往前，遍历两个字符串
        int i = s.length() - 1;
        int j = t.length() - 1;
        // 记录进位
        int carry = 0;
        while (i >= 0 || j >= 0) {
            Integer num = carry;
            if (i >= 0) {
                num += s.charAt(i--) - '0';
            }
            if (j >= 0) {
                num += t.charAt(j--) - '0';
            }

            if (num < 10) {
                carry = 0;
            } else {
                // 产生进位
                carry = num / 10;
                num %= 10;
            }
            res.append(num);
        }
        if (carry != 0) {
            res.append(carry);
        }
        // 反转
        res.reverse();
        return res.toString();
    }
}
